'''对已经聚类的数据进行去重（格式：只保留一行，将去重前的报表合并成一列逗号隔开，去重之前的数据项在一行数据中依次排开）'''
import pandas as pd
import numpy as np


def process_clustering_report(file_path):
    """
    读取聚类分析报告并处理聚类结果数据

    参数:
    file_path: Excel文件路径

    返回:
    处理后的DataFrame
    """

    # 读取Excel文件中的聚类结果sheet
    try:
        df = pd.read_excel(file_path, sheet_name='处理后的聚类结果')
        print(f"成功读取数据，共{len(df)}行，{len(df.columns)}列")
    except Exception as e:
        print(f"读取文件失败: {e}")
        return None

    # 显示数据基本信息
    print("\n数据列名:", df.columns.tolist())
    print("\n前几行数据:")
    print(df.head())

    # 创建合并的聚类ID（部门名称 + 聚类标签）
    df['聚类ID'] = df['部门名称'].astype(str) + '_' + df['聚类标签'].astype(str)
    print(f"\n创建合并聚类ID后的数据列名: {df.columns.tolist()}")

    # 处理留存标记的数据
    if '是否留存' in df.columns:
        # 找出有留存标记的数据
        retained_data = df[df['是否留存'].notna() & (df['是否留存'] == 1)].copy()
        print(f"\n发现{len(retained_data)}条有留存标记的数据")

        # 对于有留存标记的数据，将报表名称和数据项分别替换聚类代表名称和聚类代表数据项
        if '聚类代表名称' in df.columns and '聚类代表数据项' in df.columns:
            retained_data['报表名称'] = retained_data['聚类代表名称']
            retained_data['数据项'] = retained_data['聚类代表数据项']
            print("已将有留存标记的数据的报表名称和数据项替换为聚类代表名称和聚类代表数据项")
    else:
        retained_data = pd.DataFrame()
        print("\n未找到'是否留存'字段")

    # 按照合并后的聚类ID分组处理
    def process_group(group):
        """
        处理每个聚类分组
        """
        if len(group) == 0:
            return pd.Series()

        # 创建结果字典
        result = {}

        # 新增：统计合并项数（该聚类分组中的原始行数）
        result['合并项数'] = len(group)

        # 检查该组中是否有留存标记的数据
        has_retained = '是否留存' in group.columns and any(group['是否留存'].notna() & (group['是否留存'] == 1))

        # 如果有留存标记的数据，则取第一条留存数据作为代表
        if has_retained:
            retained_row = group[group['是否留存'].notna() & (group['是否留存'] == 1)].iloc[0]
            first_row = retained_row
            print(f"聚类ID {group.name} 使用留存数据作为代表")
        else:
            # 否则取第一行作为代表
            first_row = group.iloc[0]

        # 复制第一行的所有数据作为基础，但不包括聚类ID
        for col in group.columns:
            if col != '聚类ID':  # 不复制聚类ID，因为它已经是分组键
                result[col] = first_row[col]

        # 特殊处理字段（除了聚类ID、中心报表、数据项、是否合理、是否留存之外的字段）
        # 这些字段需要合并并用'|'隔开
        exclude_cols = ['聚类ID', '中心报表', '数据项', '是否合理', '是否留存']
        merge_cols = [col for col in group.columns if col not in exclude_cols]

        for col in merge_cols:
            # 获取该列的所有唯一值（去重）
            unique_values = group[col].dropna().unique()
            if len(unique_values) > 0:
                # 将唯一值用'|'连接
                result[col] = '|'.join(map(str, unique_values))

        # 处理数据项列 - 行转列到多列
        data_items = group['数据项'].dropna().unique()
        max_columns = 5  # 假设最多分成5列，可以根据需要调整

        for i in range(max_columns):
            col_name = f'数据项_{i + 1}'
            if i < len(data_items):
                result[col_name] = data_items[i]
            else:
                result[col_name] = np.nan

        # 处理是否合理字段
        audit_values = group['是否合理'].dropna().unique()
        if '不合理' in audit_values:
            result['是否合理'] = '不合理'
        else:
            result['是否合理'] = '合理'

        # 处理是否留存字段 - 如果有任何一条数据有留存标记，则标记为1
        if '是否留存' in group.columns:
            if any(group['是否留存'].notna() & (group['是否留存'] == 1)):
                result['是否留存'] = 1
            else:
                result['是否留存'] = np.nan


        return pd.Series(result)

    # 应用分组处理
    processed_data = df.groupby('聚类ID').apply(process_group).reset_index()

    print(f"\n处理完成！原始数据{len(df)}行，处理后{len(processed_data)}行")

    return processed_data


def save_processed_data(df, output_path):
    """
    保存处理后的数据到Excel文件
    """
    try:
        with pd.ExcelWriter(output_path, engine='openpyxl') as writer:
            df.to_excel(writer, sheet_name='处理后的聚类结果', index=False)
        print(f"数据已保存到: {output_path}")
    except Exception as e:
        print(f"保存文件失败: {e}")


# 使用示例
if __name__ == "__main__":
    # 文件路径 - 请修改为你的实际文件路径
    input_file = "C:/Users/xingwenzheng/Desktop/代码测试集/全量数据/聚类报告_匹配结果_weighted0.xlsx"
    # C:/Users/xingwenzheng/Desktop/代码测试集/整合数据全/聚类报告_匹配结果_最终.xlsx
    output_file = "C:/Users/xingwenzheng/Desktop/代码测试集/全量数据/聚类报告_去重合并结果_weighted0.xlsx"
    # C:/Users/xingwenzheng/Desktop/代码测试集/整合数据全/聚类报告_去重合并结果_最终.xlsx

    # 处理数据
    processed_df = process_clustering_report(input_file)

    if processed_df is not None:
        # 显示处理后的数据
        print("\n处理后的数据:")
        print(processed_df.head())

        # 保存结果
        save_processed_data(processed_df, output_file)

        # 显示统计信息
        print(f"\n各聚类ID的数据分布:")
        print(processed_df['聚类ID'].value_counts())

        # 显示数据项列的分布情况
        data_item_cols = [col for col in processed_df.columns if '数据项_' in col]
        print(f"\n数据项被拆分到{len(data_item_cols)}列")

        for col in data_item_cols:
            non_null_count = processed_df[col].notna().sum()
            print(f"{col}: {non_null_count}个非空值")

        # 新增：显示合并项数的统计信息
        print(f"\n合并项数统计:")
        print(f"总合并行数: {processed_df['合并项数'].sum()}")
        print(f"平均每个聚类合并行数: {processed_df['合并项数'].mean():.2f}")
        print(f"最大合并行数: {processed_df['合并项数'].max()}")
        print(f"最小合并行数: {processed_df['合并项数'].min()}")
        print(f"合并项数分布:")
        print(processed_df['合并项数'].value_counts().sort_index())